package negocio.daos;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import negocio.entidades.Disciplina;
import negocio.entidades.Usuario;

public class UsuarioDAO {
	private EntityManager em;

	public UsuarioDAO(EntityManager em) {
		this.em = em;
	}

	public Usuario salvar(Usuario u) throws Exception {
		if (u.getId() > 0) {
			if (consultarPorId(u.getId()) != null) {
				em.merge(u);
			}
		} else {
			em.persist(u);
		}
		return u;
	}

	public void excluir(long id) throws Exception {
		Usuario u = consultarPorId(id);
		if (u != null) {
			em.remove(u);
		}
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> listar(String matricula, String nome)  throws Exception{
		Query q = em.createQuery(
				"select u from Usuario u where u.matricula like lower('"
						+ matricula + "%') and u.nome like lower('" + nome
						+ "%')", Usuario.class);
		return q.getResultList();
	}

	public Usuario consultarPorId(long id) throws Exception{
		Usuario u = (Usuario) em.createQuery(
				"select u from Usuario u LEFT JOIN FETCH u.notificacoes where u.id ="
						+ id).getSingleResult();
		return u;
	}

	public Usuario findByUsuario(String usuario) throws Exception{
		Usuario usu = null;
		Query q = em
				.createQuery("select u from Usuario u LEFT JOIN FETCH u.notificacoes where lower(u.usuario) = '"
						+ usuario + "'");
		try {
			usu = (Usuario) q.getSingleResult();
			return usu;
		} catch (Exception e) {
			return null;
		}
	}

	public Usuario findByEmail(String email) throws Exception{
		Usuario usu = null;
		Query q = em
				.createQuery("select top 1 u from Usuario u where lower(u.email) = '"
						+ email + "'");
			usu = (Usuario) q.getSingleResult();
			return usu;

	}

	public Usuario findByMatricula(String matricula) throws Exception{
		Usuario usu = null;
		Query q = em
				.createQuery("select u from Usuario u where lower(u.matricula) = '"
						+ matricula + "'");
		try {
			usu = (Usuario) q.getSingleResult();
			return usu;
		} catch (Exception e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> findByUsuNotificacao(String sqlFilter) throws Exception {
		try {
			Query q = em.createQuery(
					"select distinct u from Usuario u left join fetch u.notificacoes "
							+ sqlFilter, Usuario.class);
			return q.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Disciplina> listarDisciplinasByAlunoId(long id) throws Exception{
		try {
			Query q = em
					.createQuery(
							"select m.disciplina from Matricula m left join m.disciplina where m.situacao = 'CURSANDO' and m.aluno.id = "
									+ id, Disciplina.class);
			return q.getResultList();
		} catch (Exception e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Disciplina> listarDisciplinasByProfId(long id) throws Exception {
		Query q = em.createQuery(
				"select d from Disciplina d where d.status = 1 and d.professor.id = "
						+ id, Disciplina.class);
		return q.getResultList();
	}

}
